////////////////////////////////////////////////////////////////////////////////

#include "player.h"
#include "bullet.h"

////////////////////////////////////////////////////////////////////////////////

#include <cassert>
#include <cmath>

////////////////////////////////////////////////////////////////////////////////


Player::Player()
: m_HitPoints(0),
  m_KeyFlags(0x0)
{
    const double defaultPlayerVelocity = 5;
    SetAbsoluteVelocity(defaultPlayerVelocity);
}


////////////////////////////////////////////////////////////////////////////////


Player::~Player()
{
}


////////////////////////////////////////////////////////////////////////////////


void Player::SetHitPoints( int _hitPoints )
{
    assert(_hitPoints >= 0);
    m_HitPoints = _hitPoints;
}


////////////////////////////////////////////////////////////////////////////////


int Player::GetHitPoints() const
{
    return m_HitPoints;
}


////////////////////////////////////////////////////////////////////////////////


void Player::SetKeyFlags( unsigned int _flags )
{
    m_KeyFlags = _flags;
}


////////////////////////////////////////////////////////////////////////////////


void Player::SetAimPosition( const STM::ScrPosition& _position )
{
    m_AimPosition = _position;
}


////////////////////////////////////////////////////////////////////////////////


STM::Position Player::GetAimPosition() const
{
    return m_AimPosition;
}


////////////////////////////////////////////////////////////////////////////////


void Player::CalculateVelocity()
{
    // Get current velocity
    STM::Velocity velocity(0, 0);
    double absoluteVelocity = GetAbsoluteVelocity();

    if ( m_KeyFlags & STM::W_KEY )
        // Move up
        velocity.second -= absoluteVelocity;

    if ( m_KeyFlags & STM::S_KEY )
        // Move down
        velocity.second += absoluteVelocity;

    if ( m_KeyFlags & STM::A_KEY )
        // Move left
        velocity.first -= absoluteVelocity;

    if ( m_KeyFlags & STM::D_KEY )
        // Move right
        velocity.first += absoluteVelocity;

    // Diagonal movement
    if (velocity.first != 0 && velocity.second != 0)
    {
        const double angle = 45;
        velocity.first *= sin(angle);
        velocity.second *= cos(angle);
    }

    // Set new velocity
    SetVelocity(velocity);
}


////////////////////////////////////////////////////////////////////////////////


Bullet* Player::ProcessShooting()
{
    if ( !(m_KeyFlags & STM::MOUSE1) || !m_Weapon.Shoot() )
        return NULL;


    // Create bullet
    return new Bullet( GetPosition(), m_AimPosition );     
}


 ////////////////////////////////////////////////////////////////////////////////
